package cn.hxzy.common.domain.vo;

import cn.hxzy.common.domain.SysSubject;
import cn.hxzy.teacher.service.ISysSubjectService;
import org.apache.poi.EmptyFileException;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * ExcelUtilVo 类用于从 Excel 文件中导入数据到 SysSubject 对象列表。
 * 该类依赖于 Apache POI 库来处理 Excel 文件。
 *
 * @param <T> 继承自 SysSubject 的类
 */
public class ExcelUtilVo<T extends SysSubject> {
    /**
     * SysSubject 的子类的 Class 对象。
     */
    private Class<T> clazz;
    /**
     * SysSubjectService 接口的实现类实例，用于查询专业 ID、发布人 ID 和标签 ID。
     */
    private ISysSubjectService isysSubjectService;

    /**
     * 构造函数，初始化 clazz 和 isysSubjectService。
     *
     * @param clazz 继承自 SysSubject 的类的 Class 对象
     * @param isysSubjectService SysSubjectService 接口的实现类实例
     */
    public ExcelUtilVo(Class<T> clazz, ISysSubjectService isysSubjectService) {
        this.clazz = clazz;
        this.isysSubjectService = isysSubjectService;
    }
    /**
     * 从 Excel 文件中导入数据到 SysSubject 对象列表。
     *
     * @param inputStream 包含 Excel 文件内容的输入流
     * @return SysSubject 对象列表
     * @throws Exception 如果导入过程中发生错误
     */


    //主要功能是从Excel文件中导入数据到SysSubject对象列表
    public List<T> importExcel(InputStream inputStream) throws Exception {
        // 创建 Workbook 对象, 用于读取 Excel 文件
        Workbook workbook = createWorkbook(inputStream);
        // 获取第一个工作表, 用于读取数据
        Sheet sheet = workbook.getSheetAt(0);
        // 获取行迭代器, 用于遍历每一行
        Iterator<Row> rowIterator = sheet.iterator();

        System.out.println("是否有下一行: " + rowIterator.hasNext());

        // 跳过第一行，因为第一行是标题行
        if (rowIterator.hasNext()) {
            Row firstRow = rowIterator.next();
            System.out.println("跳过了第一行: " + firstRow.getRowNum());
        } else {
            System.out.println("没有下一行");
            throw new IllegalArgumentException(" 文件没有足够的行数");
        }

        // 跳过第二行
        if (rowIterator.hasNext()) {
            Row secondRow = rowIterator.next();
            System.out.println("跳过了第二行: " + secondRow.getRowNum());
        } else {
            System.out.println("没有下一行可以跳过");
            throw new IllegalArgumentException(" 文件没有足够的行数");
        }

        // 检查第三行是否存在
        if (!rowIterator.hasNext()) {
            System.out.println("没有第三行");
            throw new IllegalArgumentException("文件数据为空");
        }

        // 遍历每一行，创建 SysSubject 对象
        List<T> dataList = new ArrayList<>();
        // 遍历每一行，创建 SysSubject 对象
        while (rowIterator.hasNext()) {
            // 获取当前行
            Row row = rowIterator.next();
            // 创建 SysSubject 对象
            T obj = clazz.getDeclaredConstructor().newInstance();
            SysSubject sysSubject = (SysSubject) obj; // 现在可以安全地进行强制转换

            // 题型
            String tixing = getCellValue(row.getCell(0));
            validateField(tixing, "题型");
            setSubjectType(sysSubject, tixing);

            // 题目
            String subjectName = getCellValue(row.getCell(1));
            validateField(subjectName, "题目");
            sysSubject.setSubjectName(subjectName);

            // 选项A、B、C、D、E、F
            String xuanxiangA = getCellValue(row.getCell(2));
            String xuanxiangB = getCellValue(row.getCell(3));
            String xuanxiangC = getCellValue(row.getCell(4));
            String xuanxiangD = getCellValue(row.getCell(5));
            String xuanxiangE = getCellValue(row.getCell(6));
            String xuanxiangF = getCellValue(row.getCell(7));

            sysSubject.setOptionA(xuanxiangA);
            sysSubject.setOptionB(xuanxiangB);
            sysSubject.setOptionC(xuanxiangC);
            sysSubject.setOptionD(xuanxiangD);
            sysSubject.setOptionE(xuanxiangE);
            sysSubject.setOptionF(xuanxiangF);

            // 专业
            String zhuanye = getCellValue(row.getCell(8));
            validateField(zhuanye, "专业");

            // 难度
            String nandu = getCellValue(row.getCell(9));
            validateField(nandu, "难度");
            setSubjectLevel(sysSubject, nandu);

            // 答案
            String daan = getCellValue(row.getCell(10));
            validateField(daan, "答案");
            sysSubject.setSubjectAnswer(daan);

            // 发布人
            String faburen = getCellValue(row.getCell(11));
            validateField(faburen, "发布人");

            // 标签
            String htmlContent = getCellValue(row.getCell(12));
            String[] tagNamesStrArray = htmlContent.replaceAll("<[^>]*>", "").split(",");
            List<String> biaoqian = Arrays.asList(tagNamesStrArray);
            System.out.println("标签：" + tagNamesStrArray);
            System.out.println("专业：" + zhuanye);

            // 查询专业id
            Integer zhuanyeid = isysSubjectService.selectzhuanyeid(zhuanye);
            System.out.println("专业id：" + zhuanyeid);
            if (zhuanyeid == null) {
                throw new IllegalArgumentException("无效的专业名称: " + zhuanye);
            }

            // 查询发布人id
            Integer fabuid = isysSubjectService.selectfaburen(faburen);
            System.out.println("发布人id：" + fabuid);
            if (fabuid == null) {
                throw new IllegalArgumentException("无效的发布人名称");
            }

            // 根据标签查找id
            List<Integer> biaoqianid = isysSubjectService.selectbiaoqianid(Arrays.asList(tagNamesStrArray));
            System.out.println("标签id：" + biaoqianid);
            if (biaoqianid == null || biaoqianid.isEmpty()) {
                throw new IllegalArgumentException("标签不能为空");
            }
            for (Object item : biaoqianid) {
                if (item == null) {
                    throw new IllegalArgumentException("标签包含无效值");
                }
            }

            // 将标签id转换为字符串, 用逗号分隔
            String resultUsingJoining = biaoqianid.stream()
                    .map(String::valueOf)
                    .collect(Collectors.joining(","));

            sysSubject.setSubjectMajor(zhuanyeid);
            sysSubject.setSubjectLabel(resultUsingJoining);
            sysSubject.setCreator(Long.valueOf(fabuid));

            dataList.add(obj);
        }
        workbook.close();
        return dataList;
    }
    /**
     * 创建 Workbook 对象。
     *
     * @param inputStream 包含 Excel 文件内容的输入流
     * @return Workbook 对象
     * @throws IOException 如果读取文件时发生错误
     * @throws InvalidFormatException 如果文件格式无效
     */
    private Workbook createWorkbook(InputStream inputStream) throws IOException, InvalidFormatException {
        try {
            return WorkbookFactory.create(inputStream);
        } catch (EmptyFileException e) {
            throw new IllegalArgumentException("上传的文件为空。", e);
        } catch (IOException e) {
            throw new IOException("读取文件时发生错误。", e);
        } catch (Exception e) {
            throw new RuntimeException("创建工作簿时发生未知错误。", e);
        }
    }
    /**
     * 获取单元格的值。
     *
     * @param cell 单元格对象
     * @return 单元格的字符串值
     */
    private String getCellValue(Cell cell) {
        if (cell == null) {
            return null;
        }
        switch (cell.getCellType()) {
            case NUMERIC:
                return String.valueOf(cell.getNumericCellValue());
            case STRING:
                return cell.getStringCellValue();
            default:
                return null;
        }
    }
    /**
     * 设置题型。
     *
     * @param sysSubject SysSubject 对象
     * @param tixing 题型字符串
     */
    private void setSubjectType(SysSubject sysSubject, String tixing) {
        if (tixing.equals("单选题")) {
            sysSubject.setSubjectType(2);
        } else if (tixing.equals("多选题")) {
            sysSubject.setSubjectType(1);
        } else if (tixing.equals("判断题")) {
            sysSubject.setSubjectType(0);
        } else {
            throw new IllegalArgumentException("无效的题型: " + tixing);
        }
    }
    /**
     * 设置难度。
     *
     * @param sysSubject SysSubject 对象
     * @param nandu 难度字符串
     */
    // 抛出异常
    private void setSubjectLevel(SysSubject sysSubject, String nandu) {
        if (nandu.equals("低")) {
            sysSubject.setSubjectLv(1);
        } else if (nandu.equals("中")) {
            sysSubject.setSubjectLv(2);
        } else if (nandu.equals("高")) {
            sysSubject.setSubjectLv(3);
        } else {
            throw new IllegalArgumentException("无效的难度: " + nandu);
        }
    }
    /**
     * 验证字段是否为空。
     *
     * @param value 字段值
     * @param fieldName 字段名称
     */
    // 抛出异常
    private void validateField(String value, String fieldName) {
        if (value.isEmpty()) {
            throw new IllegalArgumentException(fieldName + "不能为空");
        }
    }
}